/*
 * Stoper.java
 * El Stoper toma los dos ultimos puntos de l apelota calcula la direccion recta de la pelota y se coloca
 * moviendo solo su posicion y en su trayectoria ... es para evitar tiros directos al arco
 * Created on 10 de marzo de 2007, 11:53
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */



package futbol.tacticas.concursantes2007.AlfArgentin;

import futbol.tacticas.*;
import java.awt.*;
import java.awt.geom.*;


/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 * El Stoper toma los dos ultimos puntos de l apelota calcula la direccion recta de la pelota y se coloca
 * moviendo solo su posicion y en su trayectoria ... es para evitar tiros directos al arco
 * <p>Copyright: Licencia GPL</p>
 *
 * <p>Company: </p>
 * @author Alfredo Garcia Woods
 * @version 1.0
 */
public class Stoper implements IJugador{

    Point ultimaPosicionDeLaPelota=null;
    double posicionFijaX;
    double posicionFijaY;

    final double rangoDemovimiento=30;

    int yoJugador=0;

    double minX;
    double maxX;
    double minY;
    double maxY;
    /** Creates a new instance of Defensa */
    public Stoper(int num,double posicionFijaX,double posicionFijaY) {
        yoJugador=num;
        this.posicionFijaX=posicionFijaX;
        this.posicionFijaY=posicionFijaY;


        minX=posicionFijaX - rangoDemovimiento;
        maxX=posicionFijaX + rangoDemovimiento;
        minY=posicionFijaY - rangoDemovimiento;
        maxY=posicionFijaY + rangoDemovimiento;
    }


    /**
     * getjugador
     *
     * @return int
     */
    public int getjugador(){
        return yoJugador;
    }


    /**
     * getComandoMovimiento
     *
     * @param sj SituacionJugadores
     * @return Comando
     */
    public Comando getComandoMovimiento(SituacionJugadores sj){

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

          if(sj.getMasCercanoDeBola()==yoJugador){// si soy el que estoy mas cerca directamente voy a la pelota
       return new  ComandoIrA(yoJugador, bola.getX(), bola.getY());
      }


        if(ultimaPosicionDeLaPelota!=null){


            double   x1=bola.getX();
            double   x2=ultimaPosicionDeLaPelota.getX();
            double   y1=bola.getY();
            double   y2=ultimaPosicionDeLaPelota.getY();

            //calculo la pendiente
            double m=(y2-y1)/(x2-x1);

            //ordenada al origen
            double b=((y1*x2)-(y2*x1))/(x2-x1);

            double yNuevo=m*posicionFijaX+b;
            ultimaPosicionDeLaPelota=bola;

            if(yNuevo<100 && yNuevo>-100){// para que no se salga de la cancha

                Point2D punto=   movimientoDentroDelCarril(bola.getX(), yNuevo);
                ultimaPosicionDeLaPelota=bola;
                return new  ComandoIrA(yoJugador, punto.getX(), punto.getY());// trato de ir donde est la bola

            }else{
                ultimaPosicionDeLaPelota=bola;
                return new  ComandoIrA(yoJugador, posicionFijaX, posicionFijaY);
            }

        } else{
            ultimaPosicionDeLaPelota=bola;
            return new  ComandoIrA(yoJugador, posicionFijaX, posicionFijaY);

        }



    }

    /**
     * movimientoDentroDelCarril
     *
     * @param x double
     * @param y double
     * @return Double
     */
    public Point2D.Double movimientoDentroDelCarril(double x, double y){
        Point2D.Double punto=new Point2D.Double();
        //si est dentro del carril devuelve la posicion pedida
        if((x<maxX ) ){
            punto.x=x;
            punto.y=y;
            return punto;
        }else{

            punto.x=posicionFijaX ;
            punto.y=y;

            return punto;}

    }

    /**
     * getComandoTiro
     *
     * @param sj SituacionJugadores
     * @return Comando
     */
    public Comando getComandoTiro(SituacionJugadores sj){
    //un simple despeje a una posicion fija
         Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

        boolean despejarDeCostado=false;
        for (int i = 0; i < contrarios.length; i++) {
            Point point = contrarios[i];
            if(point.getX()<-15){
                despejarDeCostado=true;
            }
        }

        if(despejarDeCostado){

            ComandoGolpearBola comand= new ComandoGolpearBola(yoJugador,-120,-120);
            return comand;
        }
        else{
         ComandoGolpearBola comand= new ComandoGolpearBola(yoJugador,10,120);
            return comand;
        }
    }
}


